home *** CD-ROM | disk | FTP | other *** search
/ QuickTime 2.0 Developer Kit / QuickTime 2.0 Developer Kit.iso / pc / windows / qtw_201 / setup / samples / p9000 / p9000.asm < prev    next >
Encoding:
Assembly Source File  |  1994-12-19  |  10.0 KB  |  376 lines

  1. ; ---------------------------------------------------------------------
  2. ;
  3. ; P9000.ASM     Sample VHDW Component for P9000 chips
  4. ;
  5. ;               Version 1.0
  6. ;
  7. ;               (c) Copyright 1988-1994 Apple Computer, Inc. All Rights Reserved.
  8. ;
  9. ; ---------------------------------------------------------------------
  10.  
  11.         INCLUDE QTMACROS.INC
  12.         INCLUDE P9000.INC
  13.  
  14.  
  15. ; Data Segment
  16. ; ------------
  17. DGROUP  GROUP   _DATA
  18. _DATA   SEGMENT PARA PUBLIC 'DATA'
  19. LinBase LABEL   DWORD            ; Linear address...
  20. LinLow  WORD    ?                ; ...low
  21. LinHigh WORD    ?                ; ...high
  22. SelBase DWORD   0                ; Current selector base
  23. Selector WORD   0                ; Selector for linear addressing
  24. p9      P9000   {0,0}            ; P9000 Interface
  25. _DATA   ENDS
  26.  
  27.  
  28. ; Code Segment
  29. ; ------------
  30. CODESEG SEGMENT PARA USE16 PUBLIC 'CODE'
  31.         OPTION  LANGUAGE:C
  32.         .386
  33.         ASSUME  DS:DGROUP
  34.         EXTERN  PASCAL ALLOCSELECTOR:FAR
  35.         EXTERN  PASCAL FREESELECTOR:FAR
  36.         EXTERN  PASCAL SETSELECTORBASE:FAR
  37.         EXTERN  PASCAL SETSELECTORLIMIT:FAR
  38.         EXTERN  PASCAL IdentifyP9000:FAR
  39.  
  40.  
  41. ; --------------------------------------------------------
  42. ; Function PhysToLin: Convert a physical address to a linear address
  43. ;
  44. ; The physical address must be above 1 MB.  To use the linear
  45. ; address, the caller must assign it to a selector.
  46. ; --------------------------------------------------------
  47.         ALIGN   16
  48. PhysToLin PROC  USES ESI EDI, Physical:DWORD, ByteSize:DWORD
  49.  
  50. ; Get the physical address in BX:CX and the size in SI:DI
  51.         MOV     ECX, Physical
  52.         SHLD    EBX, ECX, 16
  53.         MOV     EDI, ByteSize
  54.         SHLD    ESI, EDI, 16
  55.  
  56. ; Call DPMI
  57.         MOV     AX, 0800H
  58.         INT     31H
  59.         JC      Error
  60.         MOV     DX, BX
  61.         MOV     AX, CX
  62. Exit:   RET
  63.  
  64. ; Handle DPMI error
  65. Error:  XOR     DX, DX
  66.         XOR     AX, AX
  67.         JMP     Exit
  68.  
  69. ; All done!
  70. PhysToLin ENDP
  71.  
  72.  
  73. ; --------------------------------------------------------
  74. ; Function FreeLinear: Free a linear address allocated
  75. ; by PhysToLin
  76. ; --------------------------------------------------------
  77.         ALIGN   16
  78. FreeLinear PROC  Linear:DWORD
  79.         MOV     ECX, Linear
  80.         SHLD    EBX, ECX, 16
  81.         MOV     AX, 0801H
  82.         INT     31H
  83.         RET
  84. FreeLinear ENDP
  85.  
  86.  
  87. ; --------------------------------------------------------
  88. ; Function DispatchP9000: Dispatch the hardware functions
  89. ; --------------------------------------------------------
  90. DispatchP9000 PROC FAR
  91.  
  92. ; Establish stack addressability; get dispatch code
  93.         PUSH    BP
  94.         MOV     BP, SP
  95.         XCHG    [BP+6], AX
  96.         POP     BP
  97.  
  98. ; Jump on disptach code
  99.         CMP     AX, VDSP_SETBANK
  100.         JE      SetBank
  101.         CMP     AX, VDSP_SLIDEWINDOW
  102.         JE      SlideWind
  103.         CMP     AX, VDSP_SAVECONTEXT
  104.         JE      SaveBank
  105.         CMP     AX, VDSP_RESTCONTEXT
  106.         JE      RestBank
  107.         CMP     AX, VDSP_SETTARGET
  108.         JE      SetTarget
  109.         CMP     AX, VDSP_READWRITE
  110.         JE      ReadWrite
  111.         CMP     AX, VDSP_IDENTIFY
  112.         JE      Identify
  113.         CMP     AX, VDSP_VERSION
  114.         JE      GetVersion
  115.         CMP     AX, VDSP_BANKTABLE
  116.         JE      BankTable
  117.         CMP     AX, VDSP_BITBLTTYPE
  118.         JE      BitBltType
  119.         CMP     AX, VDSP_SCANWIDTH
  120.         JE      ScanWidth
  121.         CMP     AX, VDSP_TERMINATE
  122.         JE      Terminate
  123.  
  124. ; All done!
  125.         MOV     AX, [BP+6]
  126.         RET
  127. DispatchP9000 ENDP
  128.  
  129.  
  130.  
  131.         OPTION  PROC:PRIVATE ; Functions below are local
  132. ; --------------------------------------------------------
  133. ; Function BankTable: Decide if we need to use a bank split table
  134. ;
  135. ; Typically, adapters that use non-overlapped banks require a split table.
  136. ; Adapters that use either linear addressing or sliding banks do not use a
  137. ; split table, as the SplitWindow function ensures no scan lines are
  138. ; written across a bank boundary.
  139. ;
  140. ; Returns:  AX = TRUE or FALSE
  141. ; --------------------------------------------------------
  142.         ALIGN   16
  143. BankTable PROC  FAR SaveAX:WORD
  144.         XOR     AX, AX
  145.         RET
  146. BankTable ENDP
  147.  
  148.  
  149. ; --------------------------------------------------------
  150. ; Function BitBltType: Decide whose BitBlt to use
  151. ;
  152. ; Returns:  AX = the type
  153. ; --------------------------------------------------------
  154.         ALIGN   16
  155. BitBltType PROC FAR SaveAX:WORD
  156.         MOV     AX, BBL_DRVR
  157.         RET
  158. BitBltType ENDP
  159.  
  160.  
  161. ; --------------------------------------------------------
  162. ; Function GetVersion: return the version of our code
  163. ;
  164. ; Returns:  AX = the version
  165. ; --------------------------------------------------------
  166.         ALIGN   16
  167. GetVersion PROC FAR SaveAX:WORD
  168.         MOV     AX, 1
  169.         RET
  170. GetVersion ENDP
  171.  
  172.  
  173. ; --------------------------------------------------------
  174. ; Function Identify: Determine if this hardware routine
  175. ; matches the current adapter and driver
  176. ;
  177. ; Returns:  AX = TRUE   hardware matches
  178. ;                FALSE  hardware does not match
  179. ; --------------------------------------------------------
  180. Identify PROC   FAR USES ES SI DI
  181.  
  182. ; Call our C routine to identify the P9000. We've coded it in C
  183. ; (see P9000V.CPP) because it would be a major pain to code
  184. ; in assembler.
  185.         PUSH    DS
  186.         PUSH    OFFSET p9
  187.         CALL    IdentifyP9000
  188.         TEST    AX, AX
  189.         JZ      NoMatch
  190.  
  191. ; Convert the physical address to a linear address
  192.         PUSH    p9.dwMemory
  193.         PUSH    p9.dwPhysical
  194.         CALL    PhysToLin
  195.         ADD     SP, 8
  196.         MOV     LinLow, AX
  197.         MOV     LinHigh, DX
  198.         CMP     LinBase, 0
  199.         JE      NoMatch
  200.  
  201. ; Allocate a selector
  202.         PUSH    DS
  203.         CALL    ALLOCSELECTOR
  204.         TEST    AX, AX
  205.         JZ      NoMatch
  206.         MOV     Selector, AX
  207.         PUSH    Selector
  208.         PUSH    LinBase
  209.         CALL    SETSELECTORBASE
  210.         PUSH    Selector
  211.         PUSH    0
  212.         PUSH    -1
  213.         CALL    SETSELECTORLIMIT
  214.  
  215. ; Found it!
  216. Exit:   MOV     AX, 1
  217.         RET
  218.  
  219. ; Ooops! wrong chip...
  220. NoMatch:MOV     AX, 0
  221.         RET
  222.  
  223. ; All done!
  224. Identify ENDP
  225.  
  226.  
  227. ; --------------------------------------------------------
  228. ; Function RestBank: dummy in this implementation
  229. ; --------------------------------------------------------
  230.         ALIGN   16
  231. RestBank PROC   FAR USES DS, SaveAX:WORD, ShowCursor:WORD
  232.         PUSH    DGROUP
  233.         POP     DS
  234.         RET
  235. RestBank ENDP
  236.  
  237.  
  238. ; --------------------------------------------------------
  239. ; Function ReadWrite: dummy in this implementation
  240. ; --------------------------------------------------------
  241.         ALIGN   16
  242. ReadWrite PROC  FAR SaveAX:WORD
  243.         MOV     AX, SaveAX
  244.         RET
  245. ReadWrite ENDP
  246.  
  247.  
  248. ; --------------------------------------------------------
  249. ; Function SaveBank: dummy in this implementation
  250. ; --------------------------------------------------------
  251.         ALIGN   16
  252. SaveBank PROC   FAR USES DS, SaveAX:WORD, HideCursor:WORD
  253.         PUSH    DGROUP
  254.         POP     DS
  255.         RET
  256. SaveBank ENDP
  257.  
  258.  
  259. ; --------------------------------------------------------
  260. ; Function ScanWidth: Get the scan width, also known as
  261. ; the pixel pitch
  262. ;
  263. ; Returns:  AX = Scan width
  264. ; --------------------------------------------------------
  265.         ALIGN   16
  266. ScanWidth PROC  FAR USES DS, SaveAX:WORD
  267.         PUSH    DGROUP
  268.         POP     DS
  269.         MOV     AX, p9.wScanLineWidth
  270.         RET
  271. ScanWidth ENDP
  272.  
  273.  
  274. ; --------------------------------------------------------
  275. ; Function SetBank: Set the ET4000 bank register
  276. ; --------------------------------------------------------
  277.         ALIGN   16
  278. SetBank PROC    FAR USES DX, SaveAX:WORD, BankID:WORD
  279.         PUSH    DGROUP
  280.         POP     DS
  281.         RET
  282. SetBank ENDP
  283.  
  284.  
  285. ; --------------------------------------------------------
  286. ; Function SetTarget:
  287. ; Initialize the bank and ES:DI from an offset in
  288. ; the frame buffer
  289. ;
  290. ; Returns:  AX     = 0
  291. ;           ES:DI  = 16:16 pointer in frame buffer
  292. ; --------------------------------------------------------
  293.         ALIGN   16
  294. SetTarget PROC  FAR USES DS, SaveAX:WORD, Offst:DWORD
  295.  
  296. ; Establish data area addressability
  297.         PUSH    DGROUP
  298.         POP     DS
  299.  
  300. ; Add offset to selector base and allocate a new selector
  301.         MOV     EAX, Offst
  302.         ADD     EAX, LinBase
  303.         MOV     SelBase, EAX
  304.         PUSH    Selector
  305.         PUSH    eax
  306.         CALL    SETSELECTORBASE
  307.  
  308. ; Return ES:DI to the caller
  309.         MOV     ES, Selector
  310.         XOR     DI, DI
  311.         RET
  312. SetTarget ENDP
  313.  
  314. ; --------------------------------------------------------
  315. ; Function SlideWind:
  316. ; Adjust the selector base to keep the offset under 64 KB
  317. ;
  318. ; Entry:  ES:DI = current target pointer
  319. ;
  320. ; Returns:  DI may be updated
  321. ;           ES may have a new selector base
  322. ; --------------------------------------------------------
  323.         ALIGN   16
  324. SlideWind PROC  FAR SaveAX:WORD, BankID:WORD
  325.  
  326. ; Only process if offset >= 48kb
  327.         CMP     DI, 0C000H
  328.         JB      NoChg
  329.  
  330. ; Establish data area addressability
  331.         PUSH    DS
  332.         PUSH    EDI
  333.         PUSH    DGROUP
  334.         POP     DS
  335.  
  336. ; Compute new base address and allocate a new selector
  337.         MOVZX   EDI, DI
  338.         ADD     EDI, SelBase
  339.         MOV     SelBase, EDI
  340.         PUSH    ES
  341.         PUSH    EDI
  342.         CALL    SETSELECTORBASE
  343.  
  344. ; Return ES:DI to the caller
  345.         MOV     ES, Selector
  346.         POP     EDI
  347.         XOR     DI, DI
  348.         POP     DS
  349.  
  350. ; All done!
  351. NoChg:  RET
  352. SlideWind ENDP
  353.  
  354.  
  355. ; --------------------------------------------------------
  356. ; Function Terminate: Deallocate the linear address selector
  357. ; --------------------------------------------------------
  358.         ALIGN   16
  359. Terminate PROC  FAR SaveAX:WORD
  360.         MOV     AX, Selector
  361.         TEST    AX, AX
  362.         JZ      Done
  363.         PUSH    ax
  364.         CALL    FREESELECTOR
  365.         PUSH    LinBase
  366.         CALL    FreeLinear
  367.         ADD     SP, 4
  368. Done:   RET
  369. Terminate ENDP
  370.  
  371.  
  372.  
  373. CODESEG ENDS
  374.          END
  375.  
  376.